precision mediump float;

uniform sampler2D uTexture;    // 输入的纹理
uniform vec2 uTexelSize;       // 纹理单个像素的大小
uniform float uBlurRadius;     // 模糊半径
uniform vec2 uBlurCenter;      // 虚化区域的中心点（归一化坐标）
uniform float uBlurRadiusArea; // 虚化区域的半径

varying vec2 vTextureCoord;    // 纹理坐标

void main() {
    // 计算当前片元到虚化区域中心的距离
    float distanceToCenter = distance(vTextureCoord, uBlurCenter);

    // 初始化颜色为当前像素颜色
    vec4 color = texture2D(uTexture, vTextureCoord);

    // 平滑的过渡区域，控制模糊效果的渐变
    float blurFactor = smoothstep(uBlurRadiusArea, uBlurRadiusArea * 0.8, distanceToCenter);

    // 限制最大模糊半径，避免崩溃
    float maxBlurRadius = min(uBlurRadius, 50.0); // 设置最大模糊半径，防止设置过大导致崩溃
    if (uBlurCenter.x<0.1||uBlurCenter.y<0.1||uBlurCenter.x>0.1||uBlurCenter.y>0.1){
        maxBlurRadius = min(uBlurRadius, 10.0);
    }else if(uBlurCenter.x<0.2||uBlurCenter.y<0.2||uBlurCenter.x>0.2||uBlurCenter.y>0.2){
        maxBlurRadius = min(uBlurRadius, 20.0);
    }
    // 如果片元在指定虚化区域范围内，执行模糊
    if (distanceToCenter < uBlurRadiusArea) {
        vec4 blurredColor = vec4(0.0);
        float totalWeight = 0.0;

        // 进行模糊卷积，取样多个周围像素，限制模糊半径的最大范围
        for (float x = -maxBlurRadius; x <= maxBlurRadius; x++) {
            for (float y = -maxBlurRadius; y <= maxBlurRadius; y++) {
                // 过滤掉权重较低的像素点，减少不必要的计算
                if (length(vec2(x, y)) > maxBlurRadius) continue;

                // 获取偏移后的纹理坐标
                vec2 offset = vec2(x * uTexelSize.x, y * uTexelSize.y);
                vec4 sample = texture2D(uTexture, vTextureCoord + offset);

                // 根据距离计算权重（越靠近中心的像素权重越高）
                float weight = 1.0 - (length(vec2(x, y)) / maxBlurRadius);
                blurredColor += sample * weight;
                totalWeight += weight;
            }
        }

        // 平均颜色值
        blurredColor /= totalWeight;

        // 混合模糊效果和原始颜色，根据 blurFactor 调整模糊强度
        color = mix(color, blurredColor, blurFactor);
    }

    // 输出最终颜色
    gl_FragColor = color;
}
